Modelling change as average lambdas

All taxa in Canada

These are models to evaluate the relationship between average population change and body size, trophic level, and lifespan traits, while accounting for differences in System and Class, and including a random effect by Binomial because the trait data was collected at the species level.

# null model
m0 = lmer(avlambda ~ (1|Binomial), data = df)
m1 = lmer(avlambda ~ Class + (1|Binomial),  data = df)
m2 = lmer(avlambda ~ Class + System + (1|Binomial), data = df)
m3 = lmer(avlambda ~ System + (1|Binomial), data = df)

# adding traits

# body size only
# class should be in each model because body size is normalised within classes
m4 = lmer(avlambda ~ log10(BodySize) + Class + (1|Binomial),  data = df)
m5 = lmer(avlambda ~ log10(BodySize) + Class + System + (1|Binomial),  data = df)
m6 = lmer(avlambda ~ Class*log10(BodySize) + (1|Binomial),  data = df)
m7 = lmer(avlambda ~ System*log10(BodySize) + (1|Binomial),  data = df)

# trophic level only
m8 = lmer(avlambda ~ TrophicLevel + (1|Binomial),  data = df)
m9 = lmer(avlambda ~ TrophicLevel + Class + (1|Binomial),  data = df)
m10 = lmer(avlambda ~ TrophicLevel + System + (1|Binomial),  data = df)
m11 = lmer(avlambda ~ Class*TrophicLevel + (1|Binomial),  data = df)
m12 = lmer(avlambda ~ System*TrophicLevel + (1|Binomial),  data = df)

# lifespan only
m13 = lmer(avlambda ~ LifeSpan + (1|Binomial),  data = df)
m14 = lmer(avlambda ~ LifeSpan + Class + (1|Binomial),  data = df)
m15 = lmer(avlambda ~ LifeSpan + System + (1|Binomial),  data = df)
m16 = lmer(avlambda ~ Class*LifeSpan + (1|Binomial),  data = df)
m17 = lmer(avlambda ~ System*LifeSpan + (1|Binomial),  data = df)

# all three traits
m18 = lmer(avlambda ~ log10(BodySize) + TrophicLevel + Class + (1|Binomial),  data = df)
m19 = lmer(avlambda ~ log10(BodySize) + LifeSpan + Class + (1|Binomial),  data = df)
m20 = lmer(avlambda ~ TrophicLevel + LifeSpan + (1|Binomial),  data = df)
m21 = lmer(avlambda ~ log10(BodySize) + TrophicLevel + LifeSpan + Class + (1|Binomial),  data = df)

Model comparison

If we compare these models, their performance looks like…

compare_performance(m0, m1, m2, m3, # no traits
                    m4, m5, m6, m7, # body size
                    m8, m9, m10, m11, m12, # trophic level
                    m13, m14, m15, m16, m17, # lifespan
                    m18, m19, m20, m21, # variations of 2 or 3 traits
                    rank = TRUE) %>% head() %>%
  kableExtra::kable() %>% kableExtra::kable_styling("striped")
Name Model AIC BIC R2_conditional R2_marginal ICC RMSE Sigma Performance_Score
m12 lmerMod -2651.267 -2592.219 0.0413731 0.0094439 0.0322336 0.1427925 0.1446303 0.8379973
m3 lmerMod -2666.747 -2637.224 0.0349035 0.0007474 0.0341816 0.1431983 0.1450023 0.5745691
m10 lmerMod -2649.471 -2608.138 0.0354866 0.0010076 0.0345137 0.1431630 0.1450241 0.5392917
m0 lmerMod -2684.811 -2667.097 0.0325788 0.0000000 0.0325788 0.1433753 0.1450729 0.5164743
m17 lmerMod -2623.293 -2576.055 0.0365969 0.0033761 0.0333334 0.1431466 0.1449834 0.5110802
m15 lmerMod -2651.300 -2615.871 0.0347394 0.0021111 0.0326974 0.1432675 0.1450350 0.5056986

“Best” model(s) evaluation

Let’s look at the top models!

Model 12 : avlambda ~ System*TrophicLevel + (1|Binomial)

#check_model(m12) this is giving an error now?
#plot_model(m12, type="pred")

Mammals in Canada

These are models to evaluate the relationship between average population change and body size, trophic level, and lifespan traits, while accounting for differences in System, and including a random effect by Binomial because the trait data was collected at the species level. The Class variable is not included in these models, because the data is subset within the Mammals class.

df_taxon = filter(df_join, Class == "Mammals") %>% na.omit()
# null model
m0 = lmer(avlambda ~ (1|Binomial), data = df_taxon)
m1 = lmer(avlambda ~ System + (1|Binomial), data = df_taxon)

# adding traits

# body size only
# class should be in each model because body size is normalised within classes
m2 = lmer(avlambda ~ log10(BodySize) + (1|Binomial),  data = df_taxon)
m3 = lmer(avlambda ~ log10(BodySize) + System + (1|Binomial),  data = df_taxon)
m4 = lmer(avlambda ~ System*log10(BodySize) + (1|Binomial),  data = df_taxon)

# trophic level only
m5 = lmer(avlambda ~ TrophicLevel + (1|Binomial),  data = df_taxon)
m6 = lmer(avlambda ~ TrophicLevel + System + (1|Binomial),  data = df_taxon)
m7 = lmer(avlambda ~ System*TrophicLevel + (1|Binomial),  data = df_taxon)

# lifespan only
m8 = lmer(avlambda ~ LifeSpan + (1|Binomial),  data = df_taxon)
m9 = lmer(avlambda ~ LifeSpan + System + (1|Binomial),  data = df_taxon)
m10 = lmer(avlambda ~ System*LifeSpan + (1|Binomial),  data = df_taxon)

# all three traits
m11 = lmer(avlambda ~ log10(BodySize) + TrophicLevel + (1|Binomial),  data = df_taxon)
m12 = lmer(avlambda ~ log10(BodySize) + LifeSpan + (1|Binomial),  data = df_taxon)
m13 = lmer(avlambda ~ TrophicLevel + LifeSpan + (1|Binomial),  data = df_taxon)
m14 = lmer(avlambda ~ log10(BodySize) + TrophicLevel + LifeSpan + (1|Binomial),  data = df_taxon)

Model comparison

compare_performance(m0, m1, # no traits
                    m2, m3, m4, # body size
                    m5, m6, m7, # trophic
                    m8, m9, m10, # lifespan
                    m11, m12, m13, m14, # combos of traits
                    rank = TRUE) %>% head() %>%
  kableExtra::kable() %>% kableExtra::kable_styling("striped")
Name Model AIC BIC R2_conditional R2_marginal ICC RMSE Sigma Performance_Score
m5 lmerMod -510.2379 -489.1949 0.1623360 0.0053920 0.1577948 0.1293784 0.1341837 0.7524747
m13 lmerMod -494.5324 -469.2809 0.1644064 0.0055093 0.1597774 0.1293237 0.1342535 0.6720469
m6 lmerMod -500.1311 -470.6709 0.1624907 0.0145367 0.1501365 0.1295234 0.1343726 0.6483838
m7 lmerMod -496.9368 -463.2681 0.1643309 0.0151153 0.1515056 0.1294144 0.1343950 0.6466554
m0 lmerMod -524.3005 -511.6748 0.1488905 0.0000000 0.1488905 0.1298620 0.1343833 0.6276346
m8 lmerMod -508.3950 -491.5606 0.1522503 0.0001447 0.1521276 0.1297337 0.1344028 0.5745688

“Best” model(s) evaluation

The two best models are two of the null options (m0 and m1). However, let’s take a look at the best model with traits included:

Model 5: avlambda ~ TrophicLevel + (1|Binomial)

#check_model(m5)
plot_model(m5, type="pred")

plot_model(m5, type="re")
## Warning in checkMatrixPackageVersion(): Package version inconsistency detected.
## TMB was built with Matrix version 1.2.18
## Current Matrix version is 1.3.2
## Please re-install 'TMB' from source using install.packages('TMB', type = 'source') or ask CRAN for a binary version of 'TMB' matching CRAN's 'Matrix' package

Model 13: avlambda ~ TrophicLevel + LifeSpan + (1|Binomial)

#check_model(m13)
plot_model(m13, type="pred")

plot_model(m13, type="re")

Birds in Canada

bird_df = filter(df, Class == "Birds")
# check missing values 
vis_miss(bird_df)

# ensure complete cases for all traits 
# helps with comparing AIC values 
bird_tidy <- bird_df[complete.cases(bird_df), ]
# check missing values 
vis_miss(bird_tidy)

# null model
m0_b = lmer(avlambda ~ (1|Binomial), data = bird_tidy)
m1_b = lmer(avlambda ~ System + (1|Binomial), data = bird_tidy)

# adding traits

# body size only
# class should be in each model because body size is normalised within classes
m2_b = lmer(avlambda ~ log10(BodySize) + (1|Binomial),  data = bird_tidy)
m3_b = lmer(avlambda ~ log10(BodySize) + System + (1|Binomial),  data = bird_tidy)
m4_b = lmer(avlambda ~ System*log10(BodySize) + (1|Binomial),  data = bird_tidy)

# trophic level only
m5_b = lmer(avlambda ~ TrophicLevel + (1|Binomial),  data = bird_tidy)
m6_b = lmer(avlambda ~ TrophicLevel + System + (1|Binomial),  data = bird_tidy)
m7_b = lmer(avlambda ~ System*TrophicLevel + (1|Binomial),  data = bird_tidy)

# lifespan only
m8_b = lmer(avlambda ~ LifeSpan + (1|Binomial),  data = bird_tidy)
m9_b = lmer(avlambda ~ LifeSpan + System + (1|Binomial),  data = bird_tidy)
m10_b = lmer(avlambda ~ System*LifeSpan + (1|Binomial),  data = bird_tidy)

# all three traits
m11_b = lmer(avlambda ~ log10(BodySize) + TrophicLevel + (1|Binomial),  data = bird_tidy)
m12_b = lmer(avlambda ~ log10(BodySize) + LifeSpan + (1|Binomial),  data = bird_tidy)
m13_b = lmer(avlambda ~ TrophicLevel + LifeSpan + (1|Binomial),  data = bird_tidy)
m14_b = lmer(avlambda ~ log10(BodySize) + TrophicLevel + LifeSpan + (1|Binomial),  data = bird_tidy)
compare_performance(m0_b, m1_b, m2_b, m3_b, # no traits
                    m4_b, m5_b, m6_b, m7_b, # body size
                    m8_b, m9_b, m10_b, m11_b, m12_b, # trophic level
                    m13_b, m14_b, # variations of 2 or 3 traits
                    rank = TRUE) %>%
  kableExtra::kable() %>% kableExtra::kable_styling("striped")
## Random effect variances not available. Returned R2 does not account for random effects.
## Random effect variances not available. Returned R2 does not account for random effects.
## Random effect variances not available. Returned R2 does not account for random effects.
## Random effect variances not available. Returned R2 does not account for random effects.
## Random effect variances not available. Returned R2 does not account for random effects.
## Random effect variances not available. Returned R2 does not account for random effects.
## Random effect variances not available. Returned R2 does not account for random effects.
## Random effect variances not available. Returned R2 does not account for random effects.
## Random effect variances not available. Returned R2 does not account for random effects.
## Random effect variances not available. Returned R2 does not account for random effects.
## Random effect variances not available. Returned R2 does not account for random effects.
## Random effect variances not available. Returned R2 does not account for random effects.
## Random effect variances not available. Returned R2 does not account for random effects.
## Random effect variances not available. Returned R2 does not account for random effects.
## Random effect variances not available. Returned R2 does not account for random effects.
## Warning: Following indices with missing values are not used for ranking:
## R2_conditional
Name Model AIC BIC R2_conditional R2_marginal RMSE Sigma Performance_Score
m7_b lmerMod -721.6308 -683.3120 NA 0.1120632 0.0755483 0.0764504 0.8108415
m0_b lmerMod -737.5092 -726.0135 NA 0.0000000 0.0802684 0.0803864 0.4107035
m5_b lmerMod -725.5454 -706.3860 NA 0.0175705 0.0795560 0.0799083 0.3893725
m1_b lmerMod -723.9732 -704.8138 NA 0.0124516 0.0797642 0.0801174 0.3503864
m6_b lmerMod -711.7819 -684.9587 NA 0.0290335 0.0790809 0.0796672 0.3231247
m2_b lmerMod -727.0366 -711.7091 NA 0.0002035 0.0802602 0.0804966 0.3218397
m11_b lmerMod -715.1653 -692.1740 NA 0.0179796 0.0795372 0.0800078 0.3024846
m8_b lmerMod -721.9455 -706.6179 NA 0.0003647 0.0802537 0.0804901 0.2871895
m13_b lmerMod -710.1186 -687.1273 NA 0.0182940 0.0795243 0.0799949 0.2689950
m3_b lmerMod -713.6950 -690.7037 NA 0.0124156 0.0797642 0.0802361 0.2616961
m9_b lmerMod -708.4588 -685.4675 NA 0.0124867 0.0797613 0.0802332 0.2255476
m12_b lmerMod -711.9907 -692.8313 NA 0.0003681 0.0802536 0.0806089 0.2008309
m14_b lmerMod -700.1714 -673.3483 NA 0.0182561 0.0795237 0.0801132 0.1826588
m10_b lmerMod -688.2070 -657.5520 NA 0.0320444 0.0789530 0.0796569 0.1587143
m4_b lmerMod -698.7430 -668.0879 NA 0.0137269 0.0797074 0.0804181 0.1309672

Modelling change as summed lambdas

All taxa in Canada

These are models to evaluate the relationship between summed population change and body size, trophic level, and lifespan traits, while accounting for differences in System and Class, and including a random effect by Binomial because the trait data was collected at the species level. Each model includes time series length to account for differences in summed lambdas in shorter vs. longer time series.

# null model
m0 = lmer(sumlambda ~ (1|Binomial) + tslength, data = df)
m1 = lmer(sumlambda ~ Class + (1|Binomial) + tslength,  data = df)
m2 = lmer(sumlambda ~ Class + System + (1|Binomial) + tslength, data = df)
m3 = lmer(sumlambda ~ System + (1|Binomial) + tslength, data = df)

# adding traits

# body size only
# class should be in each model because body size is normalised within classes
m4 = lmer(sumlambda ~ log10(BodySize) + Class + (1|Binomial) + tslength,  data = df)
m5 = lmer(sumlambda ~ log10(BodySize) + Class + System + (1|Binomial) + tslength,  data = df)
m6 = lmer(sumlambda ~ Class*log10(BodySize) + (1|Binomial) + tslength,  data = df)
m7 = lmer(sumlambda ~ System*log10(BodySize) + (1|Binomial) + tslength,  data = df)

# trophic level only
m8 = lmer(sumlambda ~ TrophicLevel + (1|Binomial) + tslength,  data = df)
m9 = lmer(sumlambda ~ TrophicLevel + Class + (1|Binomial) + tslength,  data = df)
m10 = lmer(sumlambda ~ TrophicLevel + System + (1|Binomial) + tslength,  data = df)
m11 = lmer(sumlambda ~ Class*TrophicLevel + (1|Binomial) + tslength,  data = df)
m12 = lmer(sumlambda ~ System*TrophicLevel + (1|Binomial) + tslength,  data = df)

# lifespan only
m13 = lmer(sumlambda ~ LifeSpan + (1|Binomial) + tslength,  data = df)
m14 = lmer(sumlambda ~ LifeSpan + Class + (1|Binomial) + tslength,  data = df)
m15 = lmer(sumlambda ~ LifeSpan + System + (1|Binomial) + tslength,  data = df)
m16 = lmer(sumlambda ~ Class*LifeSpan + (1|Binomial) + tslength,  data = df)
m17 = lmer(sumlambda ~ System*LifeSpan + (1|Binomial) + tslength,  data = df)

# all three traits
m18 = lmer(sumlambda ~ log10(BodySize) + TrophicLevel + Class + (1|Binomial) + tslength,  data = df)
m19 = lmer(sumlambda ~ log10(BodySize) + LifeSpan + Class + (1|Binomial) + tslength,  data = df)
m20 = lmer(sumlambda ~ TrophicLevel + LifeSpan + (1|Binomial) + tslength,  data = df)
m21 = lmer(sumlambda ~ log10(BodySize) + TrophicLevel + LifeSpan + Class + (1|Binomial) + tslength,  data = df)

Model comparison

compare_performance(m0, m1, m2, m3, # no traits
                    m4, m5, m6, m7, # body size
                    m8, m9, m10, m11, m12, # trophic level
                    m13, m14, m15, m16, m17, # lifespan
                    m18, m19, m20, m21, # variations of 2 or 3 traits
                    rank = TRUE) %>% head() %>%
  kableExtra::kable() %>% kableExtra::kable_styling("striped")
Name Model AIC BIC R2_conditional R2_marginal ICC RMSE Sigma Performance_Score
m6 lmerMod 6085.413 6162.174 0.0777289 0.0187221 0.0601326 0.7041076 0.7184480 0.6850224
m16 lmerMod 6125.509 6202.270 0.0777050 0.0138256 0.0647750 0.7035225 0.7186127 0.6342115
m7 lmerMod 6085.756 6138.899 0.0737833 0.0113476 0.0631524 0.7046896 0.7191119 0.5812964
m2 lmerMod 6083.183 6142.230 0.0737357 0.0118943 0.0625858 0.7047351 0.7191884 0.5646301
m5 lmerMod 6090.942 6155.894 0.0742245 0.0117707 0.0631977 0.7045316 0.7191726 0.5636350
m3 lmerMod 6075.776 6111.204 0.0708416 0.0062851 0.0649648 0.7053252 0.7197463 0.5125315

“Best” model(s) evaluation

Model 6: sumlambda ~ Class*log10(BodySize) + (1|Binomial) + tslength

#check_model(m6)
plot_model(m6, type="pred")
## Warning: Removed 1 row(s) containing missing values (geom_path).

Model 16: sumlambda ~ Class*LifeSpan + (1|Binomial) + tslength

#check_model(m16)
plot_model(m16, type="pred")

Mammals in Canada

These are models to evaluate the relationship between summed population change and body size, trophic level, and lifespan traits, while accounting for differences in System and Class, and including a random effect by Binomial because the trait data was collected at the species level. Each model includes time series length to account for differences in summed lambdas in shorter vs. longer time series.

# null model
m0 = lmer(sumlambda ~ (1|Binomial), data = df_taxon)
m1 = lmer(sumlambda ~ System + (1|Binomial), data = df_taxon)

# adding traits

# body size only
# class should be in each model because body size is normalised within classes
m2 = lmer(sumlambda ~ log10(BodySize) + (1|Binomial) + tslength,  data = df_taxon)
m3 = lmer(sumlambda ~ log10(BodySize) + System + (1|Binomial) + tslength,  data = df_taxon)
m4 = lmer(sumlambda ~ System*log10(BodySize) + (1|Binomial) + tslength,  data = df_taxon)

# trophic level only
m5 = lmer(sumlambda ~ TrophicLevel + (1|Binomial) + tslength,  data = df_taxon)
m6 = lmer(sumlambda ~ TrophicLevel + System + (1|Binomial) + tslength,  data = df_taxon)
m7 = lmer(sumlambda ~ System*TrophicLevel + (1|Binomial) + tslength,  data = df_taxon)

# lifespan only
m8 = lmer(sumlambda ~ LifeSpan + (1|Binomial) + tslength,  data = df_taxon)
m9 = lmer(sumlambda ~ LifeSpan + System + (1|Binomial) + tslength,  data = df_taxon)
m10 = lmer(sumlambda ~ System*LifeSpan + (1|Binomial) + tslength,  data = df_taxon)

# all three traits
m11 = lmer(sumlambda ~ log10(BodySize) + TrophicLevel + (1|Binomial) + tslength,  data = df_taxon)
m12 = lmer(sumlambda ~ log10(BodySize) + LifeSpan + (1|Binomial) + tslength,  data = df_taxon)
m13 = lmer(sumlambda ~ TrophicLevel + LifeSpan + (1|Binomial) + tslength,  data = df_taxon)
m14 = lmer(sumlambda ~ log10(BodySize) + TrophicLevel + LifeSpan + (1|Binomial) + tslength,  data = df_taxon)

Model comparison

compare_performance(m0, m1, # no traits
                    m2, m3, m4, # body size
                    m5, m6, m7, # trophic
                    m8, m9, m10, # lifespan
                    m11, m12, m13, m14, # combos of traits
                    rank = TRUE) %>% head() %>%
  kableExtra::kable() %>% kableExtra::kable_styling("striped")
Name Model AIC BIC R2_conditional R2_marginal ICC RMSE Sigma Performance_Score
m5 lmerMod 784.1246 809.3762 0.2109302 0.0288631 0.1874783 0.4684271 0.4881286 0.6225298
m0 lmerMod 775.5362 788.1620 0.2197032 0.0000000 0.2197032 0.4690844 0.4897047 0.6204866
m6 lmerMod 789.8921 823.5608 0.2159069 0.0347315 0.1876943 0.4681072 0.4884065 0.6166900
m7 lmerMod 790.9240 828.8013 0.2178949 0.0345982 0.1898657 0.4678565 0.4886512 0.6163295
m1 lmerMod 780.7965 801.8394 0.2234830 0.0075667 0.2175626 0.4688007 0.4898477 0.6156548
m13 lmerMod 797.0486 826.5087 0.2138352 0.0284946 0.1907767 0.4679915 0.4881880 0.5773345

“Best” model(s) evaluation

Model 5: sumlambda ~ TrophicLevel + (1|Binomial) + tslength

#check_model(m5)
plot_model(m5, type="pred")